package com.ly.pj.goods.pojo;
//公司域名（com.ly）+项目名（project-pj）+模块（goods）+层（Dao）

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 此对象为一个商品数据层访问对象,现在要求在此类中定义一个方法,这个方法基于JDBC从从数据库获取商品信息,
 * 并将其封装到map集合,要求一个行记录一个map对象(key为表中字段名,值为字段名对应的值),多个map存储到list集合.
 *
 * @Repository此注解通常用于描述数据层实现类对象,本质上就是一个特殊的@Component,
 * 都是要交给spring框架管理的一个Bean对象
 */
@Repository//此注解通常描述数据层实现类对象，本质上就是一个特殊的@Component,都是要交给spring管理的一个Bean对象
public class DefaultGoodsDao implements GoodsDao{

    @Autowired
    private DataSource dataSource;

    /*查询商品信息，一行记录映射为内存中的一个map对象*/
    public List<Map<String,Object>> findGoods() throws Throwable {

       Connection connection=null;

        Statement statement=null;
        ResultSet resultSet=null;
        String sql="select id,name,remark note,createdTime from tb_goods";
        //1.获取连接（从连接池获取）
        try{
           connection=dataSource.getConnection();
            //2.创建Statement对象
           statement=connection.createStatement();
            //3.发送sql
            resultSet=statement.executeQuery(sql);
             //4.处理结果
            List<Map<String,Object>> list=new ArrayList<>();
            while(resultSet.next()){//循环一次取一行，一行记录映射为一个map对象
                //Map<String,Object> rowMap=new HashMap<>();
                //rowMap.put("id",resultSet.getInt("id"));
                //rowMap.put("name",resultSet.getString("name"));
                //rowMap.put("remark",resultSet.getString("remark"));
                //rowMap.put("createdTime",resultSet.getTimestamp("createdTime"));
                list.add(rowMap(resultSet));//将存储了一行记录的map再存储到list集合
            }
            return list;
        }catch (SQLException e){
            e.printStackTrace();
            throw new RuntimeException(e);//转换为非检查异常（编译时不检测的异常）
        }finally {
            //5.释放资源
            //if (resultSet!=null)try{resultSet.close();}catch(Exception e){e.printStackTrace();}
            //if (statement!=null)try{statement.close();}catch(Exception e){e.printStackTrace();}
            //if (connection!=null)try{connection.close();}catch(Exception e){e.printStackTrace();}
            close(resultSet,statement,connection);
        }

    }
    private Map<String,Object> rowMap(ResultSet resultSet)throws SQLException{
        Map<String,Object> rowMap=new HashMap<>();
        //方法1映射
        //rowMap.put("id",rs.getInt("id"));
        //rowMap.put("name",rs.getString("name"));
        //rowMap.put("remark",rs.getString("remark"));
        //rowMap.put("createdTime",rs.getTimestamp("createdTime"));
        //方法2映射
        ResultSetMetaData rsmd=resultSet.getMetaData();//获取元数据(包括表中的字段名)
        int columnCount=rsmd.getColumnCount();//获取列的数量
        for(int i=0;i<columnCount;i++){
            rowMap.put(rsmd.getColumnLabel(i+1),resultSet.getObject(rsmd.getColumnLabel(i+1)));
            //getColumnLabel(i+1);获取表中字段名或字段名对应的别名
        }
        return rowMap;
    }

    /**
     * 方法封装重复代码
     * 由于关闭资源
     * @param resultSet 结果集对象
     * @param statement 执行语句对象
     * @param connection 连接对象
     *  这里的连接是返回到了池中
     */
    private void close(ResultSet resultSet,Statement statement,Connection connection){
        if (resultSet!=null)try{resultSet.close();}catch(Exception e){e.printStackTrace();}
        if (statement!=null)try{statement.close();}catch(Exception e){e.printStackTrace();}
        if (connection!=null)try{connection.close();}catch(Exception e){e.printStackTrace();}
    }
}
